#include "PointStruct.h"

// 默认构造函数
PointStruct::PointStruct(): x_crd(0), y_crd(0), z_crd(0) {
  for (int i = 0; i < 6; ++i) {
    feature[i] = 0;
  }
}
// 带参数的构造函数
PointStruct::PointStruct(sc_dt::sc_uint<16> x, sc_dt::sc_uint<16> y, sc_dt::sc_uint<8> z) 
    : x_crd(x), y_crd(y), z_crd(z) {
  for (int i = 0; i < 6; ++i) {
    feature[i] = 0;
  }
}

// 重载是基于const PointStruct& point进行的，因此不会有歧义
std::ostream& operator<<(std::ostream& os, const PointStruct& point) {
  os << "Point coordinates: ("
     << point.x_crd.to_uint() << ", "
     << point.y_crd.to_uint() << ", "
     << point.z_crd.to_uint() << "), Features: [";
  for (int i = 0; i < 6; ++i) {
    os << point.feature[i].to_uint();
    if (i < 5) os << ", ";
  }
  os << "]";
  return os;
}


void PointStruct::setFeature(int idx, sc_dt::sc_uint<16> value) {
  if (idx >= 0 && idx < 6) feature[idx] = value;
  else throw std::out_of_range("Index out of range");
}

sc_dt::sc_uint<16> PointStruct::getFeature(int idx) const {
  if (idx >= 0 && idx < 6) return feature[idx];
  throw std::out_of_range("Index out of range");
}

// 判断与传入的 point 在 z_crd 上是否相同
bool PointStruct::isSameZcrd(const PointStruct& point) const {
  return this->z_crd == point.getZ();
}

// 判断与传入的 point 在 y_crd 上是否相同
bool PointStruct::isSameYcrd(const PointStruct& point) const {
  return this->y_crd == point.getY();
}

// 判断与传入的 point 在 x_crd 上是否相同
bool PointStruct::isSameXcrd(const PointStruct& point) const {
  return this->x_crd == point.getX();
}
